////////////////////////////////////////////////////////////////////////////////
/// @brief OpenSSL class to interface libssl
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2010-2011 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
///     http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Oreste Costa-Panaia
/// @author Copyright 2011, triagens GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////

#ifndef TRIAGENS_FYN_REST_SSL_INTERFACE_H
#define TRIAGENS_FYN_REST_SSL_INTERFACE_H 1

#include <Basics/Common.h>

namespace triagens {
  namespace rest {
    namespace SslInterface {

      //////////////////////////////////////////////////////////////////////////
      /// @brief md5 hash
      //////////////////////////////////////////////////////////////////////////

      void sslMD5 (char const* inputStr, size_t length, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief md5 hash
      //////////////////////////////////////////////////////////////////////////

      void sslMD5 (char const* inputStr, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief md5 hash
      //////////////////////////////////////////////////////////////////////////

      void sslMD5 (char const* input1, size_t length1, char const* input2, size_t length2, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief sha1 hash
      //////////////////////////////////////////////////////////////////////////

      void sslSHA1 (char const* inputStr, const size_t length, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief sha1 hash
      //////////////////////////////////////////////////////////////////////////

      void sslSHA1 (char const* inputStr, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief sha224 hash
      //////////////////////////////////////////////////////////////////////////

      void sslSHA224 (char const* inputStr, const size_t length, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief sha224 hash
      //////////////////////////////////////////////////////////////////////////

      void sslSHA224 (char const* inputStr, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief sha256 hash
      //////////////////////////////////////////////////////////////////////////

      void sslSHA256 (char const* inputStr, const size_t length, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief sha256 hash
      //////////////////////////////////////////////////////////////////////////

      void sslSHA256 (char const* inputStr, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief HEX
      //////////////////////////////////////////////////////////////////////////

      void sslHEX (char const* inputStr, const size_t length, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief HEX
      //////////////////////////////////////////////////////////////////////////

      void sslHEX (char const* inputStr, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief BASE64
      //////////////////////////////////////////////////////////////////////////

      void sslBAE64 (char const* inputStr, const size_t length, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief BASE64
      //////////////////////////////////////////////////////////////////////////

      void sslBASE64 (char const* inputStr, char*& outputStr, size_t& outputLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief HMAC with sha265 hashing and base64 encoding
      //////////////////////////////////////////////////////////////////////////

      string sslHMAC (char const* key, char const* message, size_t messageLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief HMAC
      //////////////////////////////////////////////////////////////////////////

      bool verifyHMAC (char const* challenge, char const* secret, size_t secretLen, char const* response, size_t responseLen);

      //////////////////////////////////////////////////////////////////////////
      /// @brief salt
      //////////////////////////////////////////////////////////////////////////

      void salt64   (uint64_t& saltInt);

      //////////////////////////////////////////////////////////////////////////
      /// @brief salt
      //////////////////////////////////////////////////////////////////////////

      void saltChar (char*& result, size_t length = 8);
    }
  }
}

#endif
